/* 最小串口驱动实现 */
/* 基于UART 16550兼容设备 */

#define UART_BASE 0x10000000

/* UART寄存器偏移 */
#define UART_THR 0x00  // 发送保持寄存器
#define UART_LSR 0x05  // 线状态寄存器

/* 线状态寄存器位定义 */
#define LSR_THRE (1 << 5)  // 发送保持寄存器空

/* 输出单个字符 */
void uart_putc(char c)
{
    volatile unsigned char *uart = (volatile unsigned char *)UART_BASE;
    volatile unsigned char *lsr = (volatile unsigned char *)(UART_BASE + UART_LSR);
    
    /* 等待发送寄存器为空 */
    while (!(*lsr & LSR_THRE)) {
        // 空循环等待
    }
    
    /* 发送字符 */
    *uart = c;
}

/* 输出字符串 */
void uart_puts(char *s)
{
    while (*s) {
        uart_putc(*s++);
    }
}

/* 简单的串口初始化（最小实现） */
void uart_init(void)
{
    // 对于最小系统，QEMU virt平台的UART通常已经初始化
    // 这里可以留空或添加必要的初始化代码
}